package com.yonyou.isv.demo.openapi.entity.output_invoice;

import java.util.*;

/**
 * 扫码开票方法
 */
public class InsertForQRInvoice {


    /**
     * 扫码开票
     * XSF_NSRSBH	String	20	是		销售方纳税人识别号
     * JSHJ	Double	15,2	是		价税合计	两位小数
     * ORGCODE	String	100	是		电子发票平台唯一标识，从电子发票平台获取。
     * RQSJ	String	100	是		日期时间
     * SHMC	String	100	是		商户名称
     * 构造requestdatas
     *
     * @return
     */
    public static Map<String, Object> buildRequestDatasQR() {
        Map<String, Object> data = new HashMap<>();
        data.put("FPQQLSH", buildFpqqlsh());
        //纳税人识别号
        data.put("XSF_NSRSBH", "2343534345");
        //开票点档案-开票点编码
        data.put("ORGCODE", "5346645234");
        //商户名称
        data.put("SHMC", "asdasd");
        data.put("JSHJ", 117);
        data.put("KPR", "jgj");
        //支持蓝字发票扫码开票 发票类型不填默认是1 1：增值税电子普通发票； 2：增值税电子专用发票； 3：增值税普通发票； 4：增值税专用发票 ； 31：电子发票（增值税专用发票）； 32：电子发票（增值税普通发票）；
        data.put("FPLX", "31");
        //回调url
        data.put("URL", "http://47x826661y.qicp.vip/kaipiao/callback");
        //收票邮箱
        data.put("EMAIL", "jiaogjin1@yonyou.com");
        data.put("items", buildItems());
        return data;
    }

    /**
     * 获取发票请求流水号
     * 长度不超过20位，长度在1到20位的字母和数字组合，不可以重复的，不要包含window系统文件名限制的特殊字符
     *
     * @return 发票请求流水号
     */
    private static String  buildFpqqlsh() {
        //return "164291i05l0vls34";
        StringBuilder rs = new StringBuilder();
        Random random = new Random();
        for(int i=0;i<20;i++){
            rs.append(random.nextInt(9));
        }
        return rs.toString();
    }


    /**
     * 构造request发票明细
     *
     * @return
     */
    private static List<Object> buildItems() {
        List<Object> items = new ArrayList<>();
        Map<String, Object> data = new HashMap<>();
        data.put("XMMC", "客运服务");
        data.put("XMJSHJ", 117);
        //税率17%需要写成0.17的格式
        data.put("SL", 0.17);
        //SPBM字段为商品税收分类编码，不同的商品会有不同的编码，不对应的话会影响报税，需要咨询下公司财务
        data.put("SPBM", "3010504020000000000");
        items.add(data);
        return items;

    }
}
